home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
cdp
/
cdp.c
next >
Wrap
Text File
|
1993-07-08
|
9KB
|
398 lines
#define CONSOLE 1
#define TEST 0
/* /// CD-DA利用関数 /// */
#include <stdio.h>
#include <stdlib.h>
#include <cdrfrb.h>
#include <snd.h>
#include "cdp.h"
/* グローバル変数 */
/* CD時間情報の構造体 TIMEADRS */
struct TIMEADRS cdtim; /* ディスク演奏終了時刻 */
struct TIMEADRS trktim[99]; /* 各トラック毎の演奏開始時刻 */
int devno = 0; /* ドライブナンバ */
int cdtype = 0; /* CDディスクタイプ */
int sttrk = 0; /* 先頭曲ナンバ */
int endtrk = 0; /* 最終曲ナンバ */
int cdpstat = 10000; /* CDplayステイタス
( cdp.cの関数で管理し、ハード情報に直接依存しない)
(演奏 => 曲番号, 一時停止 => マイナス値 ,ディスク情報未取得 =>±10000 ) */
/* cdr_mphase 関連 */
int stat = 0; /* CD演奏(1)・非演奏(一時停止含む)(0) */
int nowmusno = 0; /* 現在演奏中の曲番号 */
struct TIMEADRS intrktim; /* トラック内演奏時刻 */
struct TIMEADRS indsktim; /* ディスク内演奏時刻 */
/* CDディスク情報の取得 */
int cdp_diskinf()
{
int ret;
#if CONSOLE
printf("CDディスク情報を読み取ります\n");
#endif
ret = cdr_cdinfo( devno, &cdtype, &sttrk, &endtrk, trktim, &cdtim );
if( cdtype == 3 )
{ sttrk = 2; }
if( ret == 0 )
{
cdpstat = 0; /* 一度cdpstatの値を停止中扱いにする */
#if CONSOLE
printf("ディスクタイプ = %d\n", cdtype);
printf("先頭トラック(曲)番号 = %d\n", sttrk);
printf("最終トラック(曲)番号 = %d\n", endtrk);
printf("ディスク内演奏時間(分) = %d\n", cdtim.min);
printf("ディスク内演奏時間(秒) = %d\n", cdtim.sec);
printf("ディスク内演奏時間(フレーム) = %d\n", cdtim.frame);
#endif
}
#if CONSOLE
else
{
printf("エラーです!!ディスク情報が読めませんでした。\n");
}
#endif
return( ret );
}
/* CD演奏状態読み取り */
int cdp_playinf()
{
int ret;
ret = cdr_mphase( devno, &stat, &nowmusno, &intrktim, &indsktim );
if( ret == CDERR7 )
{
if( stat == 0 )
{
cdp_diskinf();
}
else
{
cdpstat = 10000;
}
}
#if TEST
printf("cdst=%d ,mno=%d ,st=%d ,m/s/f=%d %d %d\n",
cdpstat, nowmusno, stat, intrktim.min, intrktim.sec, intrktim.frame);
#endif
return( ret );
}
/* CD演奏 (開始) */
void endtim(char,char,char,char *,char *,char *);
/* 演奏開始 (時刻指定) */
int cdp_tstart( struct TIMEADRS begtim )
{ /* 終了時刻設定 */
int ret;
struct TIMEADRS fintim;
endtim( cdtim.min, cdtim.sec, cdtim.frame,
&fintim.min, &fintim.sec, &fintim.frame);
#if CONSOLE
printf(" FinTim = %d %d %d \n",fintim.min,fintim.sec,fintim.frame);
#endif
ret = cdr_mtplay( devno, &begtim, &fintim); /* 演奏指令 */
if( ret == 0 )
{
cdp_playinf();
cdpstat = nowmusno; /* cdpstat値に曲番号を設定 */
}
#if CONSOLE
printf(" ret= 0x%x\n", ret);
#endif
return( ret );
}
/* 曲名指定 */
int cdp_sstart( unsigned int song_num )
{
int ret;
struct TIMEADRS sttim; /* 演奏開始時刻 (命令用) */
struct TIMEADRS fintim; /* 演奏終了時刻 (命令用) */
if( (song_num<sttrk) || (endtrk<song_num) )
{ /* 存在しない曲番号の場合はキャンセルする */
#if CONSOLE
printf(" No. %u : この番号の曲は存在しません\n", song_num);
printf(" sttrk=%d song_num=%d endtrk=%d\n",sttrk,song_num,endtrk);
#endif
return(-1);
}
sttim.min = trktim[song_num-1].min; /* 開始時刻設定 */
sttim.sec = trktim[song_num-1].sec;
sttim.frame = trktim[song_num-1].frame;
#if CONSOLE
printf(" song_number = %d\n", song_num);
printf(" sttim = %d %d %d \n", sttim.min, sttim.sec, sttim.frame);
#endif
if( song_num <= endtrk ) /* 終了時刻設定 */
{
endtim( cdtim.min, cdtim.sec, cdtim.frame,
&fintim.min, &fintim.sec, &fintim.frame);
#if CONSOLE
printf(" FinTim = %d %d %d \n",fintim.min,fintim.sec,fintim.frame);
#endif
}
else /* 終了時刻設定 (指定失敗の場合) */
{
#if CONSOLE
printf(" song_num > endtrk !! ");
#endif
return(-1);
}
ret = cdr_mtplay( devno, &sttim, &fintim); /* 演奏指令 */
if( ret == 0 )
{
cdpstat = song_num; /* cdpstat値を曲番号に設定 */
}
#if CONSOLE
printf(" ret= 0x%x\n", ret);
#endif
return( ret );
}
/* 演奏終了時刻計算 */
void endtim(char m, char s, char f, char *mi, char *se, char *fr)
{
/* 1分は60秒 ,1秒は75フレーム */
int a;
a = 4500*m + 75*s + f -1;
*mi = a/4500;
*se = ( a%4500 )/75;
*fr = a%75;
}
/* 演奏開始 (局番絶対指定) */
int cdp_go( unsigned int song_num ,char sw )
{
if( sw == 1 ) /* 演奏中割り込み可能指定の場合 */
{
if( stat == 1 ) { cdr_pause( devno ); }
if( abs(cdpstat) == 10000 ) /* ディスク情報を未取得の場合 */
{
cdp_diskinf();
}
}
int ret;
#if CONSOLE
printf("\n cdp_GO !! Next One => %d\n", song_num);
#endif
ret = cdp_sstart( song_num ); /* cdpstatはcdp_sstartで設定 */
return( ret );
}
/* 演奏開始 (最初の曲) */
int cdp_first_go()
{
int ret = -1;
if( cdpstat == 0 ) /* 停止中の場合 */
{
#if CONSOLE
printf("\n cdp_FIRST() ! Next One => %d\n", sttrk);
#endif
ret = cdp_sstart( sttrk ); /* cdpstatはcdp_sstartで設定 */
}
else if( cdpstat < 0 ) /* 一時停止中の場合 */
{
ret = cdp_cont();
}
return( ret );
}
int cdp_stop() /* 演奏中止 */
{
#if CONSOLE
printf("\n cdp_STOP() !\n");
#endif
int ret;
ret = cdr_mstop( devno );
if( abs(cdpstat) == 10000 ) /* ディスク情報未取得の場合 */
{
ret = cdp_diskinf();
}
if( ret == 0 ) /* 正常動作した場合 */
{
cdpstat = 0;
}
return( ret );
}
/* 演奏中断 */
int cdp_pause()
{
int ret;
ret = cdr_pause( devno );
if( ret == 0 || ret == DEVPAUSE ) /* 正常に一時停止状態になった場合 */
{
if( ret == 0 )
{
cdpstat = -abs( cdpstat ); /* cdpstatを負の値にする */
#if CONSOLE
printf("\n cdp_PAUSE!!\n\n");
#endif
}
#if CONSOLE
else
{ printf("\n すでに演奏中断しています\n"); }
}
else if( ret != 0 ) /* エラーの場合 */
{
printf(" cdp_pause エラーしました No.= 0x%x\n", ret);
#endif
}
return( ret );
}
/* 演奏中断解除 */
int cdp_cont()
{
int ret;
ret = cdr_continue( devno );
if( ret == 0 || ret == DEVNPAUSE || ret == DEVPLY )
{
cdpstat = abs( cdpstat ); /* cdpstatの値を正にする */
#if CONSOLE
if( ret == 0 )
{
printf("\n cdp_CONTinue!!\n\n");
}
else
{ printf("\n 既に解除されています\n"); }
}
else
{
printf(" cdp_cont エラーしました Error No. = 0x%x\n", ret);
#endif
}
return( ret );
}
/* 演奏中断と解除 */
int cdp_p_c()
{
int ret = -1;
if( stat == 1 && cdpstat > 0 )
{ ret = cdp_pause(); }
else if( cdpstat < 0 )
{ ret = cdp_cont(); }
return( ret );
}
/* 演奏を次の曲に */
int cdp_next()
{
int ret, a ,b;
b = abs( cdpstat );
if( stat == 1 ) { cdr_pause( devno ); }
if( b == 10000 ) /* ディスク情報を未取得の場合 */
{
cdpstat = nowmusno;
b = abs(cdpstat);
cdp_diskinf();
}
if( cdtype == 3 && b == 0 )
{ /* DA-DATA共存ディスクでstop状態からコールされた時の処理 */
a = 2;
}
else if( b < endtrk )
{ /* 次の曲に送る */
a = b +1;
}
else if( b == endtrk )
{ /* 現在、最後の曲のときは先頭の曲にする */
a = sttrk;
}
else /* 失敗 */
{
#if CONSOLE
printf(" Song_num > Endtrk !!\n");
#endif
return(-1);
}
#if CONSOLE
printf("\n cdp_NEXT() ! Next One => %d\n", a);
#endif
ret = cdp_sstart( a ); /* cdpstatはcdp_sstartで設定 */
return( ret );
}
/* 演奏を前に戻す */
int cdp_back()
{
int ret, a, b;
b = abs( cdpstat );
if( stat == 1 ) { cdr_pause( devno ); }
if( b == 10000 ) /* ディスク情報を未取得の場合 */
{
cdpstat = nowmusno;
b = abs(cdpstat);
cdp_diskinf();
}
if( intrktim.sec < 2 && cdpstat > 0 )
{ /* 2秒以内演奏中のときは前の曲を指定する */
if( sttrk < b )
{ a = b -1; }
else if( sttrk == b )
{ /* 現在、最初の曲のときは最後の曲を指定する */
a = endtrk;
}
}
else if( sttrk <= b )
{ /* 曲の始めに戻す (曲途中・一時停止中) */
a = b;
}
else if( b == 0 )
{ /* 停止中の場合は最後の曲を指定する */
a = endtrk;
}
else
{
#if CONSOLE
printf(" Error @ cdp_back() !!\n");
#endif
return(-1);
}
#if CONSOLE
printf("\n cdp_BACK() ! Next One => %d\n", a);
#endif
ret = cdp_sstart( a ); /* cdpstatはcdp_sstartで設定 */
return( ret );
}
/* 1曲の演奏が終わったら勝手に次の曲に設定を書き換える */
int cdp_inf_next()
{
int ret = -1;
ret = cdp_playinf();
if( cdpstat <= 0 || cdpstat == 10000) /* 停止中だったら何もしない */
{ return( ret ); }
if( stat == 0 || cdpstat != nowmusno ) /* 前の曲が終わった場合 */
{
ret = cdp_next(); /* 変数cdpstatはcdp_sstartで設定 */
}
return( ret );
}